package com.miage.itrading.client;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.DisclosurePanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;

@SuppressWarnings("deprecation")
public class ToolboxWidget extends GenericWidget {

	private VerticalPanel	menu;

	public ToolboxWidget(ItradingAffichage context, String uid) {
		super(context, uid);
	}

	public void configureWidget() {

	}

	public Widget createWidget() {
		menu = new VerticalPanel();

		DisclosurePanel trend = new DisclosurePanel("Trend");
		DisclosurePanel momentum = new DisclosurePanel("Momentum");
		DisclosurePanel volume = new DisclosurePanel("Volume");
		DisclosurePanel volativite = new DisclosurePanel("Volativité");
		DisclosurePanel autres = new DisclosurePanel("Autres");

		/**
		 * Indicateurs relatifs à la moyenne
		 */
		trend.setOpen(true);

		VerticalPanel trendPanel = new VerticalPanel();
		trendPanel.add(getMoyenneMobileSimple());
		trend.add(trendPanel);

		/**
		 * Indicateurs relatifs au momentum
		 */
		momentum.setOpen(true);

		CheckBox RSI = new CheckBox("RSI");
		RSI.setTitle("Relative Strengh Indice");

		VerticalPanel momentumPanel = new VerticalPanel();
		momentumPanel.add(RSI);
		momentum.add(momentumPanel);

		/**
		 * Indicateurs relatifs au volume
		 */
		volume.setOpen(true);

		CheckBox pullCallRatio = new CheckBox("P/C");
		pullCallRatio.setTitle("Pull Call ratio");

		CheckBox VPT = new CheckBox("VPT");
		VPT.setTitle("VPT");

		VerticalPanel volumePanel = new VerticalPanel();
		volumePanel.add(pullCallRatio);
		volumePanel.add(VPT);
		volume.add(volumePanel);

		/**
		 * Indicateurs relatifs à la volativité
		 */
		volativite.setOpen(true);

		CheckBox AVR = new CheckBox("AVR");
		AVR.setTitle("AVR");

		CheckBox BB = new CheckBox("BB");
		BB.setTitle("Bollinger Bands");

		VerticalPanel volativitePanel = new VerticalPanel();
		volativitePanel.add(AVR);
		volativitePanel.add(BB);
		volativite.add(volativitePanel);

		/**
		 * Autres indicateurs
		 */
		autres.setOpen(true);

		CheckBox advanceDeclineLine = new CheckBox("ADL");
		advanceDeclineLine.setTitle("Advance Decline Line");

		CheckBox commodityChannelIndex = new CheckBox("CCI");
		commodityChannelIndex.setTitle("Commodity Channel Index");

		VerticalPanel autresPanel = new VerticalPanel();
		autresPanel.add(advanceDeclineLine);
		autresPanel.add(commodityChannelIndex);
		autres.add(autresPanel);

		menu.add(trend);
		menu.add(momentum);
		menu.add(volume);
		menu.add(volativite);
		menu.add(autres);

		return menu;
	}

	private CheckBox getMoyenneMobilePonderee() {
		final CheckBox moyenneMobilePonderee = new CheckBox("MMP");

		moyenneMobilePonderee.setTitle("Moyenne Mobile Ponderee");

		moyenneMobilePonderee.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				System.out.println("MM" + moyenneMobilePonderee.getValue());
				if (moyenneMobilePonderee.getValue()) {

					/**
					 * Pop up de configuration
					 */
					final DialogBox choixDureeDialogBox = new DialogBox();

					Grid choixDureeGrid = new Grid(2, 2);

					final HTML explication = new HTML();
					final TextBox duree = new TextBox();
					final Button valider = new Button("Valider");
					final Button annuler = new Button("Annuler");

					choixDureeDialogBox.setTitle("Moyenne Mobile Pondérée");
					explication.setText("Durée : ");

					choixDureeGrid.setWidget(0, 0, explication);
					choixDureeGrid.setWidget(0, 1, duree);
					choixDureeGrid.setWidget(1, 0, valider);
					choixDureeGrid.setWidget(1, 1, annuler);

					choixDureeDialogBox.add(choixDureeGrid);
					choixDureeDialogBox.center();
					choixDureeDialogBox.setPopupPosition(moyenneMobilePonderee
							.getAbsoluteLeft(), choixDureeDialogBox
							.getAbsoluteTop());

					/**
					 * Keyboard listener Ecoute les touches <entree> et <esc>
					 */
					duree.addKeyPressHandler(new KeyPressHandler() {
						public void onKeyPress(KeyPressEvent event) {
							if (event.getCharCode() == KeyCodes.KEY_ENTER) {
								valider.click();
							} else if (event.getCharCode() == KeyCodes.KEY_ESCAPE) {
								annuler.click();
							}
						}
					});

					valider.addClickHandler(new ClickHandler() {
						public void onClick(ClickEvent event) {
							int dureeMM = Math.abs(Integer.parseInt(duree
									.getValue()));

							if (dureeMM > 0) {
								moyenneMobilePonderee.setText("MM " + dureeMM);
							}
							choixDureeDialogBox.hide();
						}
					});

					annuler.addClickHandler(new ClickHandler() {
						public void onClick(ClickEvent event) {
							choixDureeDialogBox.hide();
						}
					});

					choixDureeDialogBox.setVisible(true);
					choixDureeDialogBox.show();

				} else {

				}

			}
		});

		return moyenneMobilePonderee;
	}

	private CheckBox getMoyenneMobileSimple() {
		final CheckBox moyenneMobileSimple = new CheckBox("MM");

		moyenneMobileSimple.setTitle("Moyenne Mobile");

		moyenneMobileSimple.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				System.out.println("MM" + moyenneMobileSimple.getValue());
				if (moyenneMobileSimple.getValue()) {

					/**
					 * Pop up de configuration
					 */
					final DialogBox choixDureeDialogBox = new DialogBox();

					Grid choixDureeGrid = new Grid(2, 2);

					final HTML explication = new HTML();
					final TextBox duree = new TextBox();
					final Button valider = new Button("Valider");
					final Button annuler = new Button("Annuler");

					choixDureeDialogBox.setTitle("Moyenne Mobile");
					explication.setText("Durée : ");

					choixDureeGrid.setWidget(0, 0, explication);
					choixDureeGrid.setWidget(0, 1, duree);
					choixDureeGrid.setWidget(1, 0, valider);
					choixDureeGrid.setWidget(1, 1, annuler);

					choixDureeDialogBox.add(choixDureeGrid);
					choixDureeDialogBox.setPopupPosition(choixDureeDialogBox
							.getAbsoluteLeft(), choixDureeDialogBox
							.getAbsoluteTop() + 30);

					duree.setFocus(true);

					/**
					 * Keyboard listener Ecoute les touches <entree> et <esc>
					 */
					duree.addKeyPressHandler(new KeyPressHandler() {
						public void onKeyPress(KeyPressEvent event) {
							if (event.getCharCode() == KeyCodes.KEY_ENTER) {
								valider.click();
							} else if (event.getCharCode() == KeyCodes.KEY_ESCAPE) {
								annuler.click();
							}
						}
					});

					valider.addClickHandler(new ClickHandler() {
						public void onClick(ClickEvent event) {
							int dureeMM = Math.abs(Integer.parseInt(duree
									.getValue()));

							if (dureeMM > 0) {
								moyenneMobileSimple.setText("MM " + dureeMM);
							}
							choixDureeDialogBox.hide();
						}
					});

					annuler.addClickHandler(new ClickHandler() {
						public void onClick(ClickEvent event) {
							choixDureeDialogBox.hide();
						}
					});

					choixDureeDialogBox.setVisible(true);
					choixDureeDialogBox.show();

				} else {

				}

			}
		});

		return moyenneMobileSimple;
	}
}
